<?php
/*
 ************************************************************************
 Copyright [2011] [PagSeguro Internet Ltda.]

 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at

 http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 ************************************************************************
 */

require_once "./PagSeguroLibrary/PagSeguroLibrary.php";
require_once "./functions.php";
require_once '../admin/config/conexao.class.php';
require_once '../admin/config/crud.class.php'; 
$con = new conexao(); // instancia classe de conxao
$con->connect(); // abre conexao com o banco
class NotificationListener
{

	public static function main()
	{

		$code = (isset($_POST['notificationCode']) && trim($_POST['notificationCode']) !== "" ? trim($_POST['notificationCode']) : null);
		$type = (isset($_POST['notificationType']) && trim($_POST['notificationType']) !== "" ? trim($_POST['notificationType']) : null);

		if ($code && $type) {

			$notificationType = new PagSeguroNotificationType($type);
			$strType = $notificationType->getTypeFromValue();

			switch ($strType) {

				case 'TRANSACTION':
					self::TransactionNotification($code);
					break;

				default:
					LogPagSeguro::error("Unknown notification type [" . $notificationType->getValue() . "]");

			}

			self::printLog($strType);

		} else {

			LogPagSeguro::error("Invalid notification parameters.");
			self::printLog();

		}

	}

	private static function TransactionNotification($notificationCode)
	{

		/*
		 * #### Crendencials #####
		 */
                $credentials = PagSeguroConfig::getAccountCredentials();
		try
		{
			$transaction = PagSeguroNotificationService::checkTransaction($credentials, $notificationCode);
                        /*
                         * Meu código:
                         */
                        $status = $transaction->getStatus(); 
                        $status_value=$status->getValue();
                        /*
                         * 1	Aguardando pagamento: o comprador iniciou a transação, mas até o momento o PagSeguro não recebeu nenhuma informação sobre o pagamento.	 WAITING_PAYMENT
                           2	Em análise: o comprador optou por pagar com um cartão de crédito e o PagSeguro está analisando o risco da transação.	 IN_ANALYSIS
                           3	Paga: a transação foi paga pelo comprador e o PagSeguro já recebeu uma confirmação da instituição financeira responsável pelo processamento.	 PAID
                           4	Disponível: a transação foi paga e chegou ao final de seu prazo de liberação sem ter sido retornada e sem que haja nenhuma disputa aberta.	 AVAILABLE
                           5	Em disputa: o comprador, dentro do prazo de liberação da transação, abriu uma disputa.	 IN_DISPUTE
                           6	Devolvida: o valor da transação foi devolvido para o comprador.	 REFUNDED
                           7	Cancelada: a transação foi cancelada sem ter sido finalizada.	 CANCELLED
                         */
                        //TRANSAÇÃO 
                        $trans_id = $transaction->getReference();//id da transação no meu banco de dados (trans_id)
                        
                        $crud_transacao = new crud('vd_transacao'); // instancia classe com as operaçoes crud, passando o nome da tabela como parametro
                        $crud_transacao->atualizar("trans_status='$status_value'", "trans_id='$trans_id'"); //atualiza status da transação
                        
                        //PEGANDO OS DADOS DA TRANSAÇÃO
                        $consulta_trans = mysql_query("SELECT * FROM vd_transacao WHERE trans_id='$trans_id'"); // query que busca todos os dados desta transação
                        $myTransacao = mysql_fetch_object($consulta_trans);
                        
                        //PEGANDO OS DADOS DO CLIENTE
                        $consulta_cliente = mysql_query("SELECT * FROM ldct_cliente WHERE clie_id='$myTransacao->clie_id'"); // query que busca todos os dados desta transação
                        $myCliente = mysql_fetch_object($consulta_cliente);
                        
                        //PEGANDO AS LICENÇAS DESTE CLIENTE
                        $consulta_licen = mysql_query("SELECT * FROM vd_licenca WHERE clie_id='$myTransacao->clie_id' ORDER BY licen_id DESC");
                        $licenca = mysql_fetch_object($consulta_licen);
                        
                        switch ($status_value) {
                            case 1: //AGUARDANDO PAGAMENTO
                                
                                break;
                            case 2: //EM ANÁLISE
                                //se já tem alguma vd_licenca (ou seja, é uma renovação ou troca de plano. Vamos dar um voto de confiança.)
                                if($licenca!=NULL){
                                    //libero o acesso dos usuários dele (UPDATE NA ldct_usuario);
                                    changeStatusUser($myTransacao->clie_id, 1);
                                    
                                    //atualizo os dados da licença deste cliente, ele pode ter trocado de plano (UPDATE em duas tabelas: vd_licenca e ldct_cliente->plan_id)
                                    $crud_licenca = new crud('vd_licenca'); // instancia classe com as operaçoes crud, passando o nome da tabela como parametro
                                    $crud_licenca->atualizar("plan_id='$myTransacao->plan_id', licen_qtd_avisos=0,licen_ativa=1,trans_id='$trans_id'", "licen_id='$licenca->licen_id'"); //atualiza licença
                                    //CALCULAR NOVA VALIDADE
                                    $now = date("Y-m-d H:i:s");
                                    setNewValidate($now, $myTransacao->plan_id, $licenca->licen_id);
                                    
                                    $crud_cliente = new crud('ldct_cliente'); // instancia classe com as operaçoes crud, passando o nome da tabela como parametro
                                    $crud_cliente->atualizar("plan_id='$myTransacao->plan_id'", "clie_id='$myTransacao->clie_id'"); //atualiza licença
                                    
                                
                                }//senão, não faz nada, pois ele estará como inativo desde a criação do cadastro e vai ganhar uma licença só no case 3.
                               break;
                            case 3: //PAGA
                                //atualiza campo trans_data_confirmacao
                                $now = date("Y-m-d H:i:s");
                                $crud_transacao->atualizar("trans_data_confirmacao='$now'", "trans_id='$trans_id'"); //atualiza status da transação
                                
                                //libero o acesso dos usuários deste cliente (UPDATE NA ldct_usuario);
                                changeStatusUser($myTransacao->clie_id, 1);
                                
                                //se já tem uma linha na tabela vd_licenca
                                if($licenca!=NULL){
                                    //atualizo os dados da licença deste cliente, ele pode ter trocado de plano (UPDATE em duas tabelas: vd_licenca e ldct_cliente->plan_id)
                                    $crud_licenca = new crud('vd_licenca'); // instancia classe com as operaçoes crud, passando o nome da tabela como parametro
                                    $crud_licenca->atualizar("plan_id='$myTransacao->plan_id', licen_qtd_avisos=0,licen_ativa=1,trans_id='$trans_id'", "licen_id='$licenca->licen_id'"); //atualiza licença
                                    //CALCULAR NOVA VALIDADE
                                    $now = date("Y-m-d H:i:s");
                                    setNewValidate($now, $myTransacao->plan_id, $licenca->licen_id);
                                    
                                    $crud_cliente = new crud('ldct_cliente'); // instancia classe com as operaçoes crud, passando o nome da tabela como parametro
                                    $crud_cliente->atualizar("plan_id='$myTransacao->plan_id'", "clie_id='$myTransacao->clie_id'"); //atualiza licença
                                
                                }else{
                                    //senão, crio uma linha de licença para ele
                                    $crud_licenca = new crud('vd_licenca');
                                    $crud_licenca->inserir("clie_id,plan_id,licen_qtd_avisos,licen_ativa,trans_id","$myTransacao->clie_id,$myTransacao->plan_id,0,1,$trans_id"); 
                                    //seta a validade
                                    $now = date("Y-m-d H:i:s");
                                    setNewValidate($now, $myTransacao->plan_id, $licenca->licen_id);
                                }
                                //envia e-mail de confirmação
                                $msg_html="
                                    Prezado cliente, seu pagamento <b>foi confirmado</b>. 
                                    <p>Você já pode acessar seu painel de controle. <a href='http://www.leadcontrolbgp.com.br'>Faça seu login</a></p>
                                        ";
                                sendMail($myCliente->clie_email, "Pagamento Confirmado", $msg_html);
                                
                               break;
                            case 4: //DISPONÍVEL
                                //isso é só um aviso de que a grana pode ser sacada do pagseguro
                                
                               break;
                            case 5: //EM DISPUTA
                                
                               break;
                            case 6: //DEVOLVIDA
                                
                               break;
                            case 7: //CANCELADA
                            //se o cliente tem uma linha na tabela vd_licenca
                            if($licenca!=NULL){
                                //esta transação que recebo a notificação é a mesma que está na vd_licenca do cliente?
                                if($licenca->trans_id==$trans_id){
                                    // DESATIVA a licença (licen_ativa);
                                    $crud_licenca = new crud('vd_licenca'); // instancia classe com as operaçoes crud, passando o nome da tabela como parametro
                                    $crud_licenca->atualizar("licen_ativa=0", "licen_id='$licenca->licen_id'"); //atualiza licença
                                    
                                    // DESATIVA os usuários deste cliente 
                                    changeStatusUser($licenca->clie_id, 0);
                                }//se não, deixa ele com a licença antiga dele (que deve estar vencida) ou sem licença (em caso de cliente novo)
                            }
                                //envia e-mail de pagamento mal-sucedido
                                $msg_html="
                                    Prezado cliente, seu pagamento <b>não foi confirmado</b>. Verifique as razões com o PagSeguro.
                                    Aguardamos a sua assinatura do LeadControl.
                                        ";
                                sendMail($myCliente->clie_email, "Pagamento Cancelado", $msg_html);
                               break;
                            default:
                                break;
                        }
       
                        $transaction->getLastEventDate(); //data da última mudança de status (só vou armazenar a data da confirmação)
                        $transaction->getCode();//código do pagseguro
                        
                        /* objeto PagSeguroTransactionStatus */  
            
		}
		catch (PagSeguroServiceException $e)
		{
			die($e->getMessage());
		}

	}

	private static function printLog($strType = null)
	{
		$count = 4;
		echo "<h2>Receive notifications</h2>";
		if ($strType) {
			echo "<h4>notifcationType: $strType</h4>";
		}
		echo "<p>Last <strong>$count</strong> items in <strong>log file:</strong></p><hr>";
		echo LogPagSeguro::getHtml($count);
	}

}
NotificationListener::main();
?>